package com.example.algorithm.hash;

import java.util.HashSet;

/**
 * @author : zhy
 * @since : 2022/7/24
 * 快乐数（hash||快慢指针）
 */
public class HappyCount {


    /**
     * 使用HashSet解决问题，当他循环时，说明有重复的数字，也就是他跑不出来，对此就不是快乐数
     * @param n
     * @return
     */
    public boolean isHappy(int n) {
        HashSet<Integer> set = new HashSet<>();
        while (true)
        {
            int sum=0;
            while (n>=1)
            {
                int temp=n%10;
                n/=10;
                sum+=temp*temp;
            }
            n=sum;
            set.add(sum);
            if(set.contains(sum)){
                return false;
            }
            if(sum==1)
            {
                return true;
            }
        }
    }


    /**
     * 下面就是使用快慢指针的方法（快慢指针力扣超时了）
     * 1：因为fast==slow的时候说明已经有重复数字了，也就是循环了
     * 2：因为fast比较快，所有。当数字为1的时候，接下来怎么弄都是1，对此当fast==1时
     * 也就完成了快乐数的查询
     * @param num
     */

    public int  getNext(int num)
    {
        int sum=0;
        while (num>0)
        {
            int temp=num%10;
            num/=10;
            sum+=temp*temp;
        }
        return sum;
    }

    public boolean isHappy1(int n){
        int slow=n;
        int fast=getNext(n);
        while(fast!=1&&fast!=slow)
        {
            slow=getNext(n);
            fast=getNext(getNext(fast));
        }
        return fast==1;
    }

    public static void main(String[] args) {

    }
}
